﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace UtilZ.Dotnet.Ex.Communication.Net.Web
{
    /// <summary>
    /// websocket Opcode 值定义 
    /// </summary>
    public class HttpOpcodes
    {
        /*********************************************************************************
         * Opcode: 4 bit​
         * 定义“有效负载数据”的解释。如果收到一个未知的操作码，接收终端必须断开WebSocket连接。
         * 下面的值是被定义过的
         * 
         * 0x0 表示一个持续帧
​         * 0x1 表示一个文本帧
​         * 0x2 表示一个二进制帧
​         * 0x3-7 预留给以后的非控制帧
​         * 0x8 表示一个连接关闭包
​         * 0x9 表示一个ping包
​         * 0xA 表示一个pong包
​         * 0xB-F 预留给以后的控制帧
         *********************************************************************************/

        /// <summary>
        /// 表示一个持续帧
        /// </summary>
        public const byte DURATION_FRAME = 0;

        /// <summary>
        /// 表示一个文本帧
        /// </summary>
        public const byte TEXT_FRAME = 1;

        /// <summary>
        /// 表示一个二进制帧
        /// </summary>
        public const byte BINARY_FRAME = 2;





        /// <summary>
        /// 预留给以后的非控制帧
        /// </summary>
        public const byte OBLIGATE1_FRAME = 3;

        /// <summary>
        /// 预留给以后的非控制帧
        /// </summary>
        public const byte OBLIGATE2_FRAME = 4;

        /// <summary>
        /// 预留给以后的非控制帧
        /// </summary>
        public const byte OBLIGATE3_FRAME = 5;

        /// <summary>
        /// 预留给以后的非控制帧
        /// </summary>
        public const byte OBLIGATE4_FRAME = 6;

        /// <summary>
        /// 预留给以后的非控制帧
        /// </summary>
        public const byte OBLIGATE5_FRAME = 7;







        /// <summary>
        /// 控制帧-表示一个连接关闭包
        /// </summary>
        public const byte CLOSE = 8;

        /// <summary>
        /// 控制帧-表示一个ping包
        /// </summary>
        public const byte PING = 9;

        /// <summary>
        /// 控制帧-表示一个pong包
        /// </summary>
        public const byte PONG = 0xA;





        /// <summary>
        /// 预留给以后的控制帧
        /// </summary>
        public const byte OBLIGATE_CONTROL1_FRAME = 0xB;

        /// <summary>
        /// 预留给以后的控制帧
        /// </summary>
        public const byte OBLIGATE_CONTROL2_FRAME = 0xC;

        /// <summary>
        /// 预留给以后的控制帧
        /// </summary>
        public const byte OBLIGATE_CONTROL3_FRAME = 0xD;

        /// <summary>
        /// 预留给以后的控制帧
        /// </summary>
        public const byte OBLIGATE_CONTROL4_FRAME = 0xE;

        /// <summary>
        /// 预留给以后的控制帧
        /// </summary>
        public const byte OBLIGATE_CONTROL5_FRAME = 0xF;


        /// <summary>
        /// 验证消息是珠江啤酒是控制消息,返回true:表示控制消息;false:内容消息
        /// </summary>
        /// <param name="opcode">控制码</param>
        /// <returns>true:表示控制消息;false:内容消息</returns>
        public static bool IsControlMessage(byte opcode)
        {
            return opcode >= CLOSE;
        }
    }
}
